package com.uade.tp.persistencia;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;

import com.uade.tp.negocio.Producto;
import com.uade.tp.negocio.ProductoSeccion;
import com.uade.tp.negocio.Seccion;

public class AdministradorPersistenciaProductoSeccion {
	private static AdministradorPersistenciaProductoSeccion pool;
	
	
	private AdministradorPersistenciaProductoSeccion()
	{
		
	}
	public static AdministradorPersistenciaProductoSeccion getInstancia()
	{
		if (pool== null)
			pool =new AdministradorPersistenciaProductoSeccion();
		return pool;
	}
	
	/**
	 * 
	 * @param p
	 * @throws Exception 
	 */
	public void insert(ProductoSeccion p, String nombreSeccion) throws Exception
	{
		//Obtener conexion BD 
		Connection con = PoolConnection.getPoolConnection().getConnection();
		
		//Generar sentencia SQL
		try
		{
				
				String senten = "SELECT * FROM ProductoSeccion where nombreSeccion = ? AND nombreProducto = ?" ;
				
				PreparedStatement ps = null;
				ps = con.prepareStatement(senten);
				ps.setString(1,nombreSeccion);
				ps.setString(2,p.getProducto().getNombre());
				ResultSet rs = ps.executeQuery();
				
				if(rs.next()){
					senten = "SELECT * FROM ProductoSeccion where nombreSeccion = ? AND nombreProducto = ? AND ESTADO = 'N'" ;
					
				    ps = null;
					ps = con.prepareStatement(senten);
					ps.setString(1,nombreSeccion);
					ps.setString(2,p.getProducto().getNombre());
				    rs = ps.executeQuery();
					
					if(rs.next()) {
						senten = "UPDATE ProductoSeccion set estado = 'S', stock = ? where nombreSeccion = ? AND nombreProducto = ?";
						ps = null;
						ps = con.prepareStatement(senten);
						ps.setInt(1, p.getStock());
						ps.setString(2,nombreSeccion);
						ps.setString(3,p.getProducto().getNombre());
					} else {
						throw new Exception("YA EXISTE EL PRODUCTO PARA LA SECCION.");
					}
					
				}else{
					//Preparar sentencia insert en tabla destino
					senten = "INSERT INTO  ProductoSeccion (nombreSeccion, nombreProducto,stock,estado) VALUES (?,?,?,?)" ;
					ps = null;
					ps = con.prepareStatement(senten);
					ps.setString(1,nombreSeccion);
					ps.setString(2,p.getProducto().getNombre());
					ps.setInt(3, p.getStock());
					ps.setString(4, p.isEstado()?"S":"N");
				}
				ps.execute();
			PoolConnection.getPoolConnection().realeaseConnection(con);
			
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Mensaje Error al Insertar ProductoSeccion: " + e.getMessage());
				System.out.println("Stack Trace al Insertar ProductoSeccion: " + e.getStackTrace());
				PoolConnection.getPoolConnection().realeaseConnection(con);
	      }
	      
	}
	public void update(ProductoSeccion p,String nombreSeccion)
	{
		//Obtener conexion BD 
		Connection con = PoolConnection.getPoolConnection().getConnection();
		
		//Generar sentencia SQL
		try
		{
			//Preparar sentencia insert en tabla destino
			String senten = "UPDATE productoSeccion set stock = ? where nombreSeccion = ? and nombreProducto=?" ;
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setInt(1,p.getStock());
			ps.setString(2,nombreSeccion);
			ps.setString(3,p.getProducto().getNombre());
			ps.execute();
			
			PoolConnection.getPoolConnection().realeaseConnection(con);
			
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Mensaje Error al Modificar Seccion: " + e.getMessage());
				System.out.println("Stack Trace al Modificar Seccion: " + e.getStackTrace());
				PoolConnection.getPoolConnection().realeaseConnection(con);
	      }
	      
		
	}
	public void delete (ProductoSeccion p,String seccion)
	{
		//Obtener conexion BD 
		Connection con = PoolConnection.getPoolConnection().getConnection();
		
		//Generar sentencia SQL
		try
		{
			//Preparar sentencia insert en tabla destino
			String senten = "UPDATE ProductoSeccion set estado=? where nombreSeccion = ? and nombreProducto = ?" ;
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setString(1, p.isEstado()?"S":"N");
			ps.setString(2, seccion);
			ps.setString(3, p.getProducto().getNombre());
			ps.execute();
			
			PoolConnection.getPoolConnection().realeaseConnection(con);
			
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Mensaje Error al Borrar ProductoSeccion: " + e.getMessage());
				System.out.println("Stack Trace al Borrar ProductoSeccion: " + e.getStackTrace());
				PoolConnection.getPoolConnection().realeaseConnection(con);
	      }
	      

	}
	public Vector<ProductoSeccion> obtenerProductos(Seccion seccion) {
		Vector<ProductoSeccion> productos=new Vector<ProductoSeccion>();
		
		//Obtener conexion BD 
		Connection con = PoolConnection.getPoolConnection().getConnection();
		
		//Generar sentencia SQL
		try
		{
			//Preparar sentencia insert en tabla destino
			String senten = "SELECT nombreSeccion,nombreProducto,stock,estado from ProductoSeccion where estado='S' and nombreSeccion=?" ;
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setString(1, seccion.getNombre());
			ResultSet result = ps.executeQuery();
			while (result.next())
			{
				ProductoSeccion p = new ProductoSeccion();
				p.setEstado((result.getString("estado").equalsIgnoreCase("S"))?true:false);
				p.setStock(result.getInt("stock"));
				p.setProducto(AdministrarPersistenciaProducto.getInstancia().buscarProducto(result.getString("nombreProducto")));
				productos.add(p);
				
			}
			
			PoolConnection.getPoolConnection().realeaseConnection(con);
			return productos;
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Mensaje Error al Obtener Producto: " + e.getMessage());
				System.out.println("Stack Trace al Obtener Producto: " + e.getStackTrace());
				PoolConnection.getPoolConnection().realeaseConnection(con);
	      }
	      return productos;
	}
	
	public ProductoSeccion obtenerProductoSeccion(Seccion seccion,Producto producto) {
				
		//Obtener conexion BD 
		Connection con = PoolConnection.getPoolConnection().getConnection();
		ProductoSeccion p = new ProductoSeccion();
		//Generar sentencia SQL
		try
		{
			//Preparar sentencia insert en tabla destino
			String senten = "SELECT nombreSeccion,nombreProducto,stock,estado from ProductoSeccion where estado='S' and nombreSeccion=? and nombreProducto=?" ;
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setString(1, seccion.getNombre());
			ps.setString(2, producto.getNombre());
			ResultSet result = ps.executeQuery();
			while (result.next())
			{
				p.setEstado((result.getString("estado").equalsIgnoreCase("S"))?true:false);
				p.setStock(result.getInt("stock"));
				p.setProducto(AdministrarPersistenciaProducto.getInstancia().buscarProducto(result.getString("nombreProducto")));
								
			}
			
			PoolConnection.getPoolConnection().realeaseConnection(con);
			
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Mensaje Error al Obtener Producto: " + e.getMessage());
				System.out.println("Stack Trace al Obtener Producto: " + e.getStackTrace());
				PoolConnection.getPoolConnection().realeaseConnection(con);
	      }
		return p;
	}

}
